package shujia.day14;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/*
    序列化：将程序中数据转成网络中传输的数据
    反序列化：将网络中传输的数据还原成程序中的数据

    对象输出流【序列化】：OutputStream
                            - ObjectOutputStream
    对象输入流【反序列化】：InputStream
                            - ObjectInputStream

    注意：
        1、无论是对象输出流还是对象输入流，本质都是字节流的子类，都是字节流的一种
        2、使用对象输出流序列化一个对象的时候，如果该对象的类没有实现Serializable的接口的话，该类的对象是不允许直接序列化
            若没有实现，程序运行的时候，就会报错：NotSerializableException 未序列化异常
            Serializable接口中，没有任何常量或抽象方法，该接口是一个标记接口
        3、我们正常去写一个对象，然后从文件读取该对象是没有问题的，但是一旦我们修改了元素类中的内容，再读取的时候就报错了
            java.io.InvalidClassException:
                shujia.day14.Student; local class incompatible:
                stream classdesc serialVersionUID = -1904573775713800401,
                local class serialVersionUID = 3614172311621133233
            因为我们一旦修改了类中的内容，serialVersionUID就会跟着改变，和原本存储的对象中的serialVersionUID不一致，就不允许还原。
            解决方案：
                1）重新写一遍，再读
                2）将serialVersionUID写固定死，自己写出来，定义成常量，不可变；自动生成即可
        4、如果将来对象中某个成员，不希望与对象一起序列化到网络中，磁盘中。可以使用一个关键字进行修饰该成员：transient



 */
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) throws Exception {
//        write();
        read();
    }

    public static void read() throws Exception {
        //创建对象输入流的对象
        //public ObjectInputStream(InputStream in)
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/shujia/day14/obj.txt"));
//        Object o = ois.readObject(); //Object o = new Student(1001, "小虎");
//        System.out.println(o);
        Student s = (Student) ois.readObject();
        System.out.println(s.getId() + "-" + s.getName());

        //释放资源
        ois.close();
    }

    public static void write() throws Exception {
        // 使用对象输出流，将一个对象写到一个文件中存储
        Student s1 = new Student(1001, "小虎");
        //创建对象输出流的对象
        // ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/shujia/day14/obj.txt"));
        oos.writeObject(s1);
        oos.flush();
        //释放资源
        oos.close();
    }


}
